package com.atom.module.coroutine.exception

import kotlin.coroutines.AbstractCoroutineContextElement
import kotlin.coroutines.CoroutineContext
// 实现了 协程上下文环境的 一个异常的处理器
interface CoroutineExceptionHandler : CoroutineContext.Element {

    companion object Key : CoroutineContext.Key<CoroutineExceptionHandler>

    fun handleException(context: CoroutineContext, exception: Throwable)

}
// 内联函数 返回一个协程上下文 该object 实现了 协程环境上下文和异常处理器 , 真正处理的是传入的 参数
inline fun CoroutineExceptionHandler(crossinline handler: (CoroutineContext, Throwable) -> Unit): CoroutineExceptionHandler {
    return object : AbstractCoroutineContextElement(CoroutineExceptionHandler), // 继承
        CoroutineExceptionHandler { // 实现接口
        override fun handleException(context: CoroutineContext, exception: Throwable) {
            handler.invoke(context, exception)
        }
    }
}
